import {defineStore} from 'pinia';
import eventBus, {Events} from '@/event-bus';
import type {Point} from '@/types';
import config from '@/config';

export const useCanvasStore = defineStore('canvas', {
    state: () => ({
        // 缩放比例（像素/米）
        scale: config.canvasConfig.initialScale,
        // 原点在画布中的位置（像素）
        origin: {x: 0, y: 0},
        // 画布尺寸
        size: {width: 0, height: 0},
        // 是否显示网格
        showGrid: true,
        // 网格大小（米）
        currentGridSize: config.canvasConfig.gridLevels[0],
        // 背景颜色
        backgroundColor: config.canvasConfig.backgroundColor
    }),

    actions: {
        /**
         * 设置画布尺寸
         * @param width 宽度
         * @param height 高度
         */
        setSize(width: number, height: number) {
            this.size.width = width;
            this.size.height = height;
            // 重新计算原点，使其位于画布中心
            this.origin = {x: width / 2, y: height / 2};
        },

        /**
         * 调整缩放比例
         * @param factor 缩放因子
         * @param center 缩放中心（画布坐标）
         */
        zoom(factor: number, center: Point) {
            // 记录缩放前的中心点实际坐标
            const realCenter = {
                x: (center.x - this.origin.x) / this.scale,
                y: -(center.y - this.origin.y) / this.scale
            };

            // 应用缩放因子
            this.scale = Math.max(5, Math.min(100, this.scale * factor));

            // 调整原点，使缩放中心保持不变
            this.origin.x = center.x - realCenter.x * this.scale;
            this.origin.y = center.y + realCenter.y * this.scale;

            // 计算最佳网格大小
            this.updateGridSize();

            // 发出缩放变化事件
            eventBus.emit(Events.SCALE_CHANGED, this.scale);
        },

        /**
         * 平移画布
         * @param delta 位移量（像素）
         */
        pan(delta: Point) {
            this.origin.x += delta.x;
            this.origin.y += delta.y;
            eventBus.emit(Events.CANVAS_REFRESH);
        },

        /**
         * 重置画布视图
         */
        resetView() {
            this.scale = config.canvasConfig.initialScale;
            this.origin = {x: this.size.width / 2, y: this.size.height / 2};
            this.updateGridSize();
            eventBus.emit(Events.SCALE_CHANGED, this.scale);
            eventBus.emit(Events.CANVAS_REFRESH);
        },

        /**
         * 切换网格显示状态
         */
        toggleGrid() {
            this.showGrid = !this.showGrid;
            eventBus.emit(Events.CANVAS_REFRESH);
        },

        /**
         * 根据当前缩放比例更新网格大小
         * 选择最接近目标像素宽度的网格级别
         */
        updateGridSize() {
            const {gridLevels, targetGridPixelSize} = config.canvasConfig;
            const targetMeterSize = targetGridPixelSize / this.scale;

            // 找到最接近目标尺寸的网格级别
            const bestLevel = gridLevels.reduce((prev, curr) => {
                return (Math.abs(curr - targetMeterSize) < Math.abs(prev - targetMeterSize)) ? curr : prev;
            }, gridLevels[0]);

            this.currentGridSize = bestLevel;
        }
    }
});
